/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	StandardHButton.java
 * 模块说明：	
 * 修改历史：
 * 2006-6-21 - lxm - 创建。
 */
package com.hd123.rumba.jsp;

import org.apache.ecs.html.A;
import org.apache.ecs.html.IMG;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.request.Dictionary;
import com.hd123.rumba.util.AccessMode;

/**
 * 标准按钮 | 服务端界面控件
 * <p>
 * 
 * 页面模型：<br>
 * <table border=0 cellspacing=3 cellpadding=0>
 * <tr bgcolor=skyblue>
 * <td>界面元素</td>
 * <td>对象属性</td>
 * </tr>
 * <tr>
 * <td><code>&lt;a&gt;</code></td>
 * <td>a</td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;&lt;img&gt;</code></td>
 * <td>img</td>
 * </tr>
 * </table>
 * 
 * @author lxm
 * 
 */
public class StandardHButton extends BaseHButton {

  public StandardHButton(Dictionary dd, Object[] params) {
    super(dd, params);
    assingParamDefaultValues();
  }

  public StandardHButton(Object[] params) {
    super(params);
    assingParamDefaultValues();
  }

  private String image;
  private String disableImage;
  private String permissionId;
  protected String url;
  private String hint;
  private Boolean enabled = Boolean.TRUE;
  private A a = null;
  private IMG img = null;

  public String toHTML() {
    return toHTML(AccessMode.READWRITE, BaseHField.VALUE_PROMPTMODE_NORMAL);
  }

  public String toHTML(int accessMode, int promptMode) {
    buildHTML(checkAccessMode(accessMode), promptMode);
    if (a != null)
      return a.toString();
    else
      return img.toString();
  }

  /**
   * 属性：不可用状态下的按钮图片。<br>
   * 如果取值为null的时候，默认等于image。<br>
   * 对应参数名"disableImage"，下一个参数为取值，类型为String。
   */
  public String getDisableImage() {
    if (disableImage == null)
      return image;
    else
      return disableImage;
  }

  public void setDisableImage(String disableImage) {
    this.disableImage = disableImage;
  }

  /**
   * 属性：指定的按钮图片。<br>
   * 对应参数名"image"，下一个参数为取值，类型为String。
   */
  public String getImage() {
    return image;
  }

  public void setImage(String image) {
    this.image = image;
  }

  /**
   * 属性：对应的权限ID。允许null，表示不受权限控制。<br>
   * 对应参数名"permissionId"，下一个参数为取值，类型为String。
   */
  public String getPermissionId() {
    return permissionId;
  }

  public void setPermissionId(String permissionId) {
    this.permissionId = permissionId;
  }

  /**
   * 属性：点击按钮后执行的url。<br>
   * 对应参数名"url"，下一个参数为取值，类型为String。
   */
  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  /**
   * 属性：提示信息。<br>
   * 对应参数名"hint"，下一个参数为取值，类型为String。
   */
  public String getHint() {
    return hint;
  }

  public void setHint(String hint) {
    this.hint = hint;
  }

  /**
   * 属性：是否可用。<br>
   * 对应参数名"enabled"，下一个参数为取值，类型为Boolean。
   */
  public Boolean getEnabled() {
    return enabled;
  }

  public void setEnabled(Boolean enabled) {
    this.enabled = enabled;
  }

  /**
   * 只读属性：界面元素&lt;a&gt;<br>
   * 对应的参数名"a"。
   */
  public A getA() {
    if (a == null) {
      a = new A();
    }
    return a;
  }

  /**
   * 只读属性：界面元素&lt;img&gt;<br>
   * 对应的参数名"img"。
   */
  public IMG getImg() {
    if (img == null) {
      img = new IMG();
    }
    return img;
  }

  protected boolean readParam(String paramName, Object paramValue) {
    if ("image".equals(paramName)) {
      this.image = (String) paramValue;
      return true;
    }
    if ("disableImage".equals(paramName)) {
      this.disableImage = (String) paramValue;
      return true;
    }
    if ("permissionId".equals(paramName)) {
      this.permissionId = (String) paramValue;
      return true;
    }
    if ("url".equals(paramName)) {
      this.url = (String) paramValue;
      return true;
    }
    if ("hint".equals(paramName)) {
      this.hint = (String) paramValue;
      return true;
    }
    if ("enabled".equals(paramName)) {
      this.enabled = (Boolean) paramValue;
      return true;
    }
    return false;
  }

  /**
   * 检查权限。
   * 
   * @param accessMode
   *          对应字段的访问模式。
   * @return 考虑了权限后的访问模式。
   */
  protected int checkAccessMode(int accessMode) {
    if (permissionId == null)
      return accessMode;
    try {
      int mode = (this.getDd().getCurrentUser().hasPermission(permissionId)) ? AccessMode.READWRITE
          : AccessMode.INVISIBLE;
      mode = Math.min(mode, accessMode);
      return mode;
    } catch (BusinessException e) {
      return accessMode;
    }
  }

  /**
   * 构造页面。
   * 
   * @param accessMode
   *          访问模式
   * @param promptMode
   *          提示模式
   */
  protected void buildHTML(int accessMode, int promptMode) {
    IMG img = this.getImg();
    img.setBorder(0);
    img.setAlt("");
    img.setAlign("absmiddle");
    img.setTitle(this.hint);
    img.addAttribute("style", "background-color: #DDDDDD; border: 1px solid #999999");
    if (accessMode == AccessMode.READWRITE
        || (accessMode == AccessMode.READONLY && VALUE_TYPE_READONLY.equals(this.getType()))) {
      A a = this.getA();
      a.setTitle(this.hint);
      a.addAttribute("tabindex", -1);
      if (url != null)
        a.setHref(url);
      assignElementAttrs(a, "a");
      img.setSrc(getImage());
      a.addElement(img);
    } else {
      img.setSrc(getDisableImage());
    }
    assignElementAttrs(img, "img");
  }

  private void assingParamDefaultValues() {
    if (this.url == null)
      this.url = "#";
  }

}
